%Anvendte teknologier

\section{Anvendte teknologier}

\subsection{DataBase(SQLite)}
SQLite en meget lille relationel database. Frameworket fylder kun omkring 300 kb, derudover har SQLite ingen kørende processer. Der kommunikeres kun ved hjælp af funktions kald, SQLite er derfor hurtigerer og bruger mindre CPU kraft end SQL servere. Dette gør SQLite til det oplagte valg på embeddede systemer. Traditionelle databaser fylder flere megabyte, f.eks. er MySQL installationen på 31,1 MB. 

SQLite indeholder meget af den funktionalitet, som de noget støre sql servere har. SQLite har dog enklte svagheder, hvoraf de største er:
\begin{itemize}
\item Kan ikke skrive til views.
\item Databasen er ikke type stærk. Det er derfor muligt at læse en variabel forkert, uden at det nødvendigvis giver en fejl.
\end{itemize}

\noindent SQLite er en del af Android frameworket, og er oplagt at benytte til at gemme data i. SQLite integreres nemt med resten af Android frameworket. f.eks returneres queries i en Cursor som kan bruges direkte med en SimpleCursorAdapter.

\subsection{Content Provider}
PongZor laver 2 databaser over highscores fra diverse spil på telefonen, for at disse applikationer kan lave highscores. Content providers bliver brugt i stor stil på android frameworket. De bliver brugt i forbindelse med blandt andet Google maps, Calendar og Contacts. Content presenteren har funktions kald som minder om SQLite frameworket og der derfor let at integrer som et lag ovenpå databasen. Content providers primære funktion er at levere interprocess kommunikation. 

\subsection{JSON}
JSON er en letvægts tekstbaseret data udvekslings notation. Notationen er især populær fordi den er letlæseligt og understøttes af mange programmeringssprog.\\
I PongZor bruger vi JSON til at udveksle data mellem server og app. Når appen sender en foruddefineret http-forespørgsel til serveren, henter denne highscoren fra databasen, fortolker den til JSON og sender JSON-filen videre til appen. Her fortolkes JSON-filen til java objekter og informationerne gemmes i appen.

\subsection{Google Maps}
For at benytte Google Maps i en Android applikation skal man registrere sin Google konto for at genere en unik nøgle som bruges til at identificere brugeren. Herefter inkluderer man et bibliotek og opretter en Activity der extender MapActivity. I den nye Activity laver man et MapView og denne kan man kontrollere ved brug af en MapController. MapControlleren indeholder informationer som koordinater og andet.\\
PongZor bruger Google Maps til at vise udviklernes adresse under menupunktet contact.

\subsection{Web server}
Til projektet skulle persisteres data lokalt og online på nettet. Til dette formål implementerede vi et PHP interface til en MySQL database. Interfacet tager imod en ny tabel række ved hjælp af http get. Data returneres som JSON som Android app'en kan fortolke.

Webserveren ejes af en i gruppe og har domænet "madfox.dk" alt relateret til dette fag ligger i en undermappe som hedder smap.

Direkte link: \url{http://www.madfox.dk/smap}

\subsection{Service}
I PongZor benyttes Android frameworkets service funktionalitet. En service kører uafhængigt af appen, selv når appen er lukket ned fortsætter servicen med at udføre sin opgave. En service er oplagt at bruge til at holde øje med events og udføre længerevarende opgaver uden at interagere med brugeren.\\
PongZor indeholder en highscore service der hvert 5 sekund laver et http kald til en server. Serveren returnerer en JSON-fil der indeholder opdaterede highscores.\\
Servicen leder JSON-filen igennem efter den højeste score og tjekker om der er nogen der har slået rekorden. Hvis dette er tilfældet sender servicen en notifikation, og telefonen vibrerer.\\
Da denne service bare skal udføre sin opgave i baggrunden og ikke har brug for at udstille funktioner til andre applikationer supporterer servicen ikke bindservice funktionalitet.\\
Det fede ved en service er at selvom appen ikke er i fokus, kan brugeren stadig blive opdateret med f.eks. en ny highscore.

\subsection{Ressources}
\textbf{Vibrator}\\
PongZor benytter telefonens vibrator når der modtages en notifikation om en ny highscore.\\
\\
\textbf{Accelerometer}\\
Vi benytter et framework (beskrevet nedenfor) til at få accelerometerets x-akse værdier og disse bruges til at styre en "pad" i PongGame spillet.

\subsection{OpenGL}
Spillene som PongZor starter er bygget med OpenGL. OpenGL er en industristandard indenfor grafisk programmering defineret af NVidia, ATI og Intel. Khronos Group vedligeholder interfacene.\\
Gennem faget Lineær Algebra stiftede vi første gang bekendtskab med grafisk programmering. Det startede interessen for mekanismerne bag 3D programmering. OpenGL virker som et kamera forstået på den måde at man først skal vælge nogle objekter at fotografere, objekterne skal have en position relativt til kameraet, og nogle af tingene kan endda bevæge sig. Kameraet skal også have nogle egenskaber f.eks. størrelse, opløsning og position. Selvom både kameraet og objekterne bevæger sig kan man stadig fange et billede. Ved 2D programmering er objekterne flade som om de skåret igennem med en kniv, men de bagvedliggende mekanismer er de samme som ved 3D programmering.\\
\\
Vi har benyttet os af et open source framework bygget på OpenGL ES 1.0, fra bogen "Beginning Android Games" af Mario Zechner, til at skabe PongGame og vi har lånt spillet SuperJumper derfra. SuperJumper er blevet modificeret så den sender spillerens score til PongZors ContentProvider. Tanken er at dette kan gøres med alle spil der er tilføjet i Pongzor og dermed få en enkelt app der har styr på alle spil og highscores, samtidig med at man får notifikationer hvis nogen slår en highscore.\\
PongGame er tilføjet for at vise forståelse for OpenGL programmering. Desuden er et coverflow med kun et objekt en anelse sløjt.

\subsection{Wifi og mobilt internet}
For at få tilladelse til at tilgå internettet via Wifi eller mobilt bredbånd skal man i appens manifest bede om tilladelse til det.\\
PongZor benytter Wifi til at opdatere highscore, vise Google Maps og en kontakt hjemmeside. I starten brugte vi en lokal webserver der krævede at server og PC var på samme netværk, men appen har udviklet sig og bruger nu en webserver på internettet.

\subsection{Notifications}
Android frameworket indeholder mulighed for at sende notifications. Notifications sendes via et Intent som frameworket håndterer. Da en Activity ikke kan udføre en handling medmindre den er i forgrunden og vinduet har fokus, udnytter vi notifications til at sende meddelelser fra vores service i baggrunden.\\
Appens notification er konfigureret til at vibrere telefonen samt visning af score i statusbaren. Hvis brugeren trykker på vores statusbar notification sendes et Intent der starter PongZor's hovedmenu.

\subsection{Activity}
PongZor indeholder 7 Activities, heriblandt MapActivity, PreferenceActivity og Fragment. Activities benytter sig af et layout defineret i XML til at vise et skærmbillede. Activities har en lifecycle som man kan benytte sig af til at opdatere skærmbilleder, gemme ting, der skal hentes senere og load af informationer, der skal vises. En Activity har tre stadier før den kører og tre efter, så der er rig mulighed for at manipulere brugerfladen på helt specifikke tidspunkter.\\
PongZor benytter sig i høj grad af Activity lifecycle til at gemme applikationens aktuelle state, initiereing af objekter og oprydning. Desuden udnyttes det er det er muligt at sende variabler med når en Activity oprettes for at skabe højere samhørighed.

\subsection{Preferences}
Android frameworket har indbygget en speciel Activity til at tage sig af preferencer der skal persisteres. En PreferenceActivity indeholder specielle preference typer såsom CheckBoxPreference, ListPreference, EditTextPreference og så videre. Disse typer bruges til at sætte applikations- og brugerindstillinger. For at tilgå preferencer fra de forskellige klasser bruges et statisk objekt kaldet SharedPreferences. Dette objekt sørger for at preference værdierne forbliver i et konsistent stadie.

\subsection{Intents}
En Intent er en abstrakt beskrivelse af en handling man vil udføre. Man kan f.eks. bruge en Intent hvis man vil starte en Activity eller sende en Notification. Når man sender en Intent med en Activity til Android Frameworket står frameworket for at ordne resten. Det er således ikke vigtigt for udvikleren at vide hvordan frameworket håndterer en Intent, man kan trygt lade frameworket finde den rette applikation. Eksempelvis bruger PongZor en Intent når brugeren vil se hjemmesiden. Har brugeren installeret tre forskellige browsere spørger frameworket efter hvilken browser der skal bruges hvis ikke der er valgt en default browser. De forskellige browsere benytter sig af et Intent Filter der beskriver de Intent's browseren kan modtage. Et Intent Filter er ligesom en si der kun slipper de Intents igennem som browseren har defineret.

\subsection{Menu}
På forsiden af Pongzor kan man trykke på settings knappen og bringe en menu frem. Denne menu indeholder mulighed for at rydde highscoren, og af udviklingsmæssige årsager også muligheden for at udfylde highscoren. Der er også mulighed for at gå til appens preferencer. Menu'en er en meget brugt feature i Android frameworket og det er her en bruger vil starte med at lede efter appens indstillinger. Menu API'en har en fælles handler for alle knapper i menuen og du kan med en switch/case nemt bestemme hvilken Activity du vil kalde baseret hvilken knap der er valgt.

\subsection{Subversion}
For at holde styr på koden når der er flere der arbejder i den har vi benyttet Subversion. Oprindeligt lagde vi ud med at bruge Github for at prøve noget nyt men da det gav problemer for at par af gruppemedlemmerne valgte vi at gå over til det kendte Subversion system.